package com.greenline.push.services;

import java.util.List;
import java.util.Map;

import com.greenline.push.services.dto.ResponseDTO;

/**
 * 
 * @Type PushCenterCommonService
 * @Desc 消息推送通用接口
 * @author shuai.zuo
 * @date 2014年10月9日
 * @Version V1.0
 */
public interface PushCenterCommonService {
    /**
     * 获取模板定义<br/>
     * 业务方可以在调用出错的情况下获取模板的定义，打印在日志中。方便排错
     * 
     * @param templateCode
     * @return
     */
    ResponseDTO<String> getBizDefine(String templateCode);

    /**
     * 点对点推送
     * 
     * @param receiverUserId
     * @param templateCode
     * @param domainCode
     * @param param
     * @param sendTime 这个字段为空,表示实时发送,传入时间可以定时发送
     * @return true表示消息接收成功,不代表推送已成功. false可能参数不合法,或者服务已挂
     */
    ResponseDTO<Boolean> send(Long receiverUserId, String templateCode, String domainCode, Map<String, String> param, Long sendTime);

    /**
     * <微信渠道>的群发，需要在推送中心创建group，并维护推送中心的群和微信对应的群的关联关系，即可推送 <br/>
     * <email> <sms> [<apns> <echat>{待定}] 等
     * 需要在推送中心创建group，并且调用对该group的订阅使挂号网userId和groupid能够关联。
     * 则调用该接口会推送给gid所关联的挂号网对用的用户。
     * 
     * @param gid
     * @param templateCode
     * @param domainCode
     * @param param
     * @param sendTime 这个字段为空,表示实时发送,传入时间可以定时发送
     * @return true表示消息接收成功,不代表推送已成功. false可能参数不合法,或者服务已挂
     */
    ResponseDTO<Boolean> sendGroup(Long gid, String templateCode, String domainCode, Map<String, String> param, Long sendTime);

    /**
     * 此接口为了方便业务方调用。其实调用的是send点对点发送。
     * 
     * @see com.greenline.push.services.PushCenterCommonService.send
     * @param userList
     * @param templateCode
     * @param domainCode
     * @param param
     * @param sendTime 这个字段为空,表示实时发送,如果传入时间可以定时发送
     * @return true表示消息接收成功,不代表推送已成功. false可能参数不合法,或者服务已挂
     */
    ResponseDTO<Boolean> sendList(List<Long> userList, String templateCode, String domainCode, Map<String, String> param, Long sendTime);

    /**
     * 创建组
     * 
     * @param indexkey
     * @return
     */
    ResponseDTO<Long> createGroup(String groupName, Long ownerUserId);

    /**
     * 订阅组
     * 
     * @param groupId
     * @return
     */
    ResponseDTO<Boolean> subscribe(Long groupId, Long userid);

    /**
     * 批量订阅组
     * 
     * @param groupId
     * @param userids
     * @return
     */
    ResponseDTO<Boolean> subscribe(Long groupId, List<Long> userids);

    /**
     * 取消订阅
     * 
     * @param groupId
     * @return
     */
    ResponseDTO<Boolean> unsubscribe(Long groupId, Long userid);

    /**
     * 推送该域下的所有用户
     * 
     * @param templateCode 模版code
     * @param domainCode 域code
     * @param param
     * @param sendTime 这个字段为空,表示实时发送,如果传入时间可以定时发送
     * @return 只表示推送中心接受成功与否,不表示是否成功推送.
     */
    ResponseDTO<Boolean> sendDomain(String templateCode, String domainCode, Map<String, String> param, Long sendTime);

    /**
     * 推送到某个集合域下所有用户[若某用户属多个域,则会推送多条]
     * 
     * @param templateCode
     * @param domainCodes
     * @param param
     * @param sendTime 这个字段为空,表示实时发送,如果传入时间可以定时发送
     * @return true|false 只表示推送中心接受成功与否,不表示是否成功推送.
     */
    ResponseDTO<Boolean> sendDomains(String templateCode, List<String> domainCodes, Map<String, String> param, Long sendTime);

    /**
     * 按组发送. 组包括[上传方式创建|按照筛选条件创建]
     * 
     * @param classCode
     * @param templateCode
     * @param domainCodes
     * @param param
     * @param sendTime 这个字段为空,表示实时发送,传入时间可以定时发送
     * @return true表示消息接收成功,不代表推送已成功. false可能参数不合法,或者服务已挂.消息创建了就自动开始定时推送
     */
    ResponseDTO<Boolean> createBroadCast(String classCode, String templateCode, String domainCode, Map<String, String> param, Long sendTime);
}
